Estruturas de Dados Essenciais com Python
Agrupe informações, simule tabelas de atributos e prepare coleções versáteis para fluxos de análise geoespacial.
Você vai aprender a
- ▹Representar atributos e tabelas em memória usando listas e dicionários.
- ▹Aplicar funções de agregação e ordenação para priorizar dados.
- ▹Evitar erros comuns ao lidar com coleções reais.
Estruturas de dados essenciais com Python
Depois de dominar variáveis individuais, o próximo passo é organizar conjuntos de informações. Listas, dicionários e conjuntos representam coleções flexíveis que simulam tabelas de atributos, resultados de sensores ou lotes de coordenadas.
Essas estruturas permitem automatizar etapas inteiras do fluxo de trabalho: higienizar dados antes da importação para o QGIS, gerar estatísticas rápidas ou converter registros para GeoJSON. Ao final, você terá uma base sólida para trabalhar com formatos tabulares e geoespaciais.
2.1 Listas: gaveteiros ordenados
Listas são coleções ordenadas e mutáveis. São ideais para guardar sequências de medições, nomes de camadas ou qualquer conjunto que precise de posição.
Em Python, criamos listas com colchetes e vírgulas separando elementos.
# A variável 'ids_setores' recebe três identificadores de setores censitários
ids_setores = ["4205407_0001", "4205407_0002", "4205407_0003"]
# Lista com medições de altura de postes
tamanhos_postes = [8.5, 9.0, 8.5, 8.75]
# Listas podem misturar tipos de dados
ponto_ifsc = ["Vértice 1", "Metálico", -27.425634, -48.54352523]
2.1.1 Indexação e slicing
A contagem começa em zero. Índices negativos caminham pelo fim da lista e o slicing retorna subconjuntos contínuos.
# Indexação direta
primeiro_id = ids_setores[0]
ultimo_id = ids_setores[-1]
# Slicing: recortes de listas
coordenadas = ponto_ifsc[2:4]
dois_primeiros = ids_setores[:2]
print(primeiro_id, ultimo_id, coordenadas, dois_primeiros)
2.1.2 Métodos úteis
Os métodos nativos tornam fácil adicionar, remover ou reordenar itens.
camadas = ["rios", "estradas", "limite_municipal"]
camadas.append("curvas_de_nivel") # Adiciona ao final
camadas.insert(1, "vegetacao") # Insere na posição 1
ultima = camadas.pop() # Remove e retorna o último item
camadas.remove("estradas") # Remove pelo conteúdo
print(camadas)
print(f"Camada removida: {ultima}")
2.1.3 Funções de agregação
Resuma coleções numéricas para apoiar decisões e comunicar resultados.
populacoes = [750, 1200, 900, 450, 1500]
soma_total = sum(populacoes)
minima = min(populacoes)
maxima = max(populacoes)
media = soma_total / len(populacoes)
print(soma_total, minima, maxima, f"{media:.2f}")
Dica do professor
Antes de importar dados para o QGIS, organize as listas de atributos em Python seguindo a mesma ordem das colunas que você espera visualizar no software. Isso facilita a criação de CSVs consistentes e reduz erros ao cruzar informações.
2.2 Dicionários: fichários por etiqueta
Dicionários usam chaves para acessar valores. São ideais para representar atributos de uma feição.
setor = {
"id": "4205407_0001",
"pop": 750,
"area_km2": 0.35
}
2.2.1 Inserção e atualização
setor["densidade"] = setor["pop"] / setor["area_km2"] # Cria nova chave
setor["pop"] = 820 # Atualiza valor
removido = setor.pop("area_km2") # Remove e retorna
print(setor)
print(f"Área removida: {removido}")
2.2.2 Acessos seguros
setor = {"id": "SC_FLO_0001", "pop": 820, "distrito": "Centro"}
if "bairro" in setor:
print(setor["bairro"])
else:
print("Bairro ausente")
bairro = setor.get("bairro", "(não informado)")
print(bairro)
Atenção aos dados reais
Dados vindos de planilhas ou serviços externos costumam trazer campos vazios ou formatos inesperados. Valide a existência de chaves e converta tipos numéricos antes de fazer contas; isso evita travamentos do script em produções longas.
2.3 Tabela em memória: lista de dicionários
Combine listas e dicionários para simular tabelas completas em memória, mantendo legibilidade.
setores = [
{"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
{"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
{"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]
pop_segundo = setores[1]["pop"]
pop_total = [s["pop"] for s in setores]
media = sum(pop_total) / len(pop_total)
print(pop_segundo)
print(pop_total)
print(f"Média: {media:.2f}")
2.4 De tabela a camada: padrão GeoJSON
Use dicionários aninhados para representar feições completas, incluindo geometria.
feature = {
"type": "Feature",
"geometry": {
"type": "Point",
"coordinates": [-48.5435, -27.4256]
},
"properties": {
"id": "4205407_0001",
"nome": "IFSC Mauro Ramos"
}
}
print(feature["geometry"]["type"])
print(feature["geometry"]["coordinates"])
print(feature["properties"])
2.5 Ordenação de dados
O parâmetro key combinado a sorted() gera rankings customizados.
setores = [
{"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
{"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
{"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]
for setor in setores:
setor["dens"] = setor["pop"] / setor["area_km2"] if setor["area_km2"] > 0 else 0
ranking = sorted(setores, key=lambda s: s["dens"], reverse=True)
for posicao, setor in enumerate(ranking, start=1):
print(f"{posicao}º - {setor['id']} · {setor['dens']:.1f} hab/km²")
Curiosidade: CSV ou JSON?
Para dados exclusivamente tabulares, CSV é leve e amplamente aceito. Quando a estrutura exige aninhamento, o JSON (ou GeoJSON) torna-se mais eficiente. Em Python, basta alternar entre listas de dicionários e dicionários aninhados para migrar entre esses formatos sem dores.
2.6 Conjuntos (set)
Conjuntos descartam duplicatas automaticamente e são úteis para obter categorias únicas.
rotulos = ["NEIM", "EMEF", "NEIM", "EMEB", "EMEF", "NEIM"]
rotulos_unicos = set(rotulos)
lista_ordenada = sorted(rotulos_unicos)
print(rotulos)
print(rotulos_unicos)
print(lista_ordenada)
2.7 Pontos de atenção
Conheça os erros mais frequentes ao manipular coleções e prepare soluções.
KeyError
- Verifique com
if chave in dicionario. - Use
dicionario.get("chave", "valor padrão").
TypeError
- Converta explicitamente valores importados.
- Valide tipos antes de calcular.
ZeroDivisionError
- Teste se o denominador é maior que zero.
- Defina valores seguros (0) quando necessário.
IndexError
- Garanta limites com
len(lista). - Proteja acessos em laços com verificações.
2.8 Exercícios práticos
Execute os desafios para fixar os conceitos e adaptar aos seus dados.
1. Slicing & append
Crie uma lista de IDs, recorte os dois primeiros, adicione um novo valor e exiba o total.
ids = ["4205407_0001", "4205407_0002", "4205407_0003"]
print(ids[:2])
ids.append("4205407_0004")
print(len(ids))
2. Campo derivado
Calcule densidades populacionais e registre o resultado em cada dicionário.
setores = [
{"id": "4205407_0001", "pop": 750, "area_km2": 0.35},
{"id": "4205407_0002", "pop": 1200, "area_km2": 0.42},
{"id": "4205407_0003", "pop": 900, "area_km2": 0.25},
]
densidades = []
for setor in setores:
if setor["area_km2"] > 0:
dens = setor["pop"] / setor["area_km2"]
setor["dens"] = dens
densidades.append(dens)
else:
setor["dens"] = 0
print(max(densidades))
print(setores)
3. Ranking por densidade
Ordene os setores por densidade e retorne os dois primeiros IDs.
ranking = sorted(setores, key=lambda s: s["dens"], reverse=True)
top2 = [s["id"] for s in ranking[:2]]
print(top2)
Conclusão
Listas, dicionários e conjuntos formam a base para manipular estruturas complexas em Python. Você agora consegue representar atributos, gerar estatísticas e preparar dados para formatos como CSV e GeoJSON.
No próximo capítulo, exploraremos decisões e laços para tornar esses dados dinâmicos e automatizar fluxos inteiros.